home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac: Not for Sale / Another.not.for.sale (Australia).iso / fade into you / getting there / WWW / WebStat 2.3.4 / TCPLib.c < prev    next >
Text File  |  1994-10-03  |  4KB  |  202 lines

  1. /*
  2.  * File:        TCPLib.c
  3.  *
  4.  * Parts of this code are (c) Copyright 1988 by Apple Computer.  All rights reserved
  5.  */
  6.  
  7. #include "TCPLib.h"
  8.  
  9. #define OPENRESOLVER    1L
  10. #define CLOSERESOLVER    2L
  11. #define STRTOADDR        3L
  12. #define    ADDRTOSTR        4L
  13. #define    ENUMCACHE        5L
  14. #define ADDRTONAME        6L
  15.  
  16. short refNum;
  17. OSErrProcPtr dnr = 0L;
  18. Handle codeHndl = 0L;
  19.  
  20. /* OpenOurRF is called to open the MacTCP driver resources */
  21.  
  22. short OpenOurRF(void)
  23. {
  24.     SysEnvRec info;
  25.     HParamBlockRec fi;
  26.     Str255 filename;
  27.  
  28.     SysEnvirons(1, &info);
  29.  
  30.     fi.fileParam.ioCompletion = 0L;
  31.     fi.fileParam.ioNamePtr = filename;
  32.     fi.fileParam.ioVRefNum = info.sysVRefNum;
  33.     fi.fileParam.ioDirID = 0;
  34.     fi.fileParam.ioFDirIndex = 1;
  35.     
  36.     while (PBHGetFInfo(&fi, false) == noErr) {
  37.         /* scan system folder for driver resource files of specific type & creator */
  38.         if (fi.fileParam.ioFlFndrInfo.fdType == 'cdev' &&
  39.             fi.fileParam.ioFlFndrInfo.fdCreator == 'mtcp') {
  40.             /* found the MacTCP driver file */
  41.             SetVol(0,info.sysVRefNum);
  42.             return(OpenResFile(filename));
  43.             }
  44.         /* check next file in system folder */
  45.         fi.fileParam.ioFDirIndex++;
  46.         fi.fileParam.ioDirID = 0;
  47.         }
  48.     return(-1);
  49.     }    
  50.  
  51.  
  52. OSErr OpenResolver(fileName)
  53. char *fileName;
  54. {
  55.     short refnum;
  56.     OSErr rc;
  57.     
  58.     if (dnr != 0L)
  59.         /* resolver already loaded in */
  60.         return(noErr);
  61.         
  62.     /* open the MacTCP driver to get DNR resources. Search for it based on
  63.        creator & type rather than simply file name */    
  64.     refnum = OpenOurRF();
  65.  
  66.     /* ignore failures since the resource may have been installed in the 
  67.        System file if running on a Mac 512Ke */
  68.        
  69.     /* load in the DNR resource package */
  70.     codeHndl = GetIndResource('dnrp', 1);
  71.     if (codeHndl == 0L) {
  72.         /* can't open DNR */
  73.         return(ResError());
  74.         }
  75.     
  76.     DetachResource(codeHndl);
  77.     if (refnum != -1) {
  78.         CloseResFile(refnum);
  79.         }
  80.         
  81.     /* lock the DNR resource since it cannot be reloated while opened */
  82.     HLock(codeHndl);
  83.     dnr = (OSErrProcPtr) *codeHndl;
  84.     
  85.     /* call open resolver */
  86.     rc = (*dnr)(OPENRESOLVER, fileName);
  87.     if (rc != noErr) {
  88.         /* problem with open resolver, flush it */
  89.         HUnlock(codeHndl);
  90.         DisposHandle(codeHndl);
  91.         dnr = 0L;
  92.         }
  93.     return(rc);
  94.     }
  95.  
  96.  
  97. OSErr CloseResolver(void)
  98. {
  99.     if (dnr == 0L)
  100.         /* resolver not loaded error */
  101.         return(notOpenErr);
  102.         
  103.     /* call close resolver */
  104.     (void) (*dnr)(CLOSERESOLVER);
  105.  
  106.     /* release the DNR resource package */
  107.     HUnlock(codeHndl);
  108.     DisposHandle(codeHndl);
  109.     dnr = 0L;
  110.     return(noErr);
  111.     }
  112.  
  113. OSErr AddrToStr(addr, addrStr)
  114. unsigned long addr;
  115. char *addrStr;                                    
  116. {
  117.     if (dnr == 0L)
  118.         /* resolver not loaded error */
  119.         return(notOpenErr);
  120.         
  121.     (*dnr)(ADDRTOSTR, addr, addrStr);
  122.     return(noErr);
  123.     }
  124.     
  125.  
  126. OSErr OpenTCPDriver()
  127. {
  128.     OSErr    err;
  129.     
  130.     err = OpenDriver("\p.IPP",&refNum);
  131.     return(err);
  132. }
  133.  
  134. OSErr InitNetwork(void)
  135. {
  136.     return OpenTCPDriver();
  137. }
  138.  
  139. static pascal void DNRResultProc (struct hostInfo *hInfoPtr, char *userDataPtr)
  140. {
  141.     *(Boolean*)userDataPtr = true;
  142. }
  143.  
  144. long GiveTime(long x)
  145. {
  146.     unsigned long    finalTicks;
  147.     extern void        HandleEvents();
  148.     
  149.     finalTicks = TickCount() + x;
  150.     
  151.     do {
  152.         HandleEvents();
  153.     } while (TickCount() < finalTicks);
  154.  
  155.     return(finalTicks);
  156. }
  157.  
  158. OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr)
  159. unsigned long addr;
  160. struct hostInfo *rtnStruct;
  161. ResultProcPtr resultproc;
  162. char *userDataPtr;                                    
  163. {
  164.     if (dnr == 0L)
  165.         /* resolver not loaded error */
  166.         return(notOpenErr);
  167.         
  168.     return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));
  169.     }
  170.     
  171.  
  172. /*    LowIPAddrToName invokes the domain name system to translate an IP address
  173.     into a domain name. */
  174.     
  175. OSErr LowIPAddrToName (unsigned long addr, char *name)
  176. {
  177.     struct hostInfo hInfo;
  178.     OSErr err;
  179.     Boolean done=false;
  180.     
  181.     if ((err = OpenResolver(nil)) != noErr) return err;
  182.     err = AddrToName(addr, &hInfo, DNRResultProc, (char*)&done);
  183.     if (err == cacheFault) {
  184.         while (!done) GiveTime(1L);
  185.         err = hInfo.rtnCode;
  186.     }
  187.     CloseResolver();
  188.     hInfo.cname[254] = 0;
  189.     strcpy(name,hInfo.cname);
  190.     return err;
  191. }
  192.  
  193. /*    IPAddrToName invokes the domain name system to translate an IP address
  194.     into a domain name. */
  195.     
  196. OSErr IPAddrToName (unsigned long addr, char *name)
  197. {
  198.     return LowIPAddrToName(addr, name);
  199. }
  200.  
  201.  
  202.